欄位定義成外鍵,這代表存在著 1 對多的資料關連,與優化列舉表單的結果相似,編修外鍵欄位值,僅需透過選取項目即可達成。
外鍵欄位內存的資料是參照其他 Entity 的 PK 值,參照的資料量通常多到已經不適合採用 <radio> 表單的設計模式,而是比較適合使用 <select> 表單設計模式,尤其是在欄位定義成 allow null 時,<select> 可以提供一個 value 屬性值為空字串的 <option> 選項,以滿足 allow null 的欄位定義,但是如果參照資料表的資料量過多,<select> 表單設計模式就將不再合適。這裡我們先假設,參照的資料量尚適合以 <select> 表單呈現,大量參照值的情況,留待後續說明。
處理步驟:
1. 判定資料欄位是否為外鍵欄位
if(
null != column.Refer.Type
&&
column.Spec.DbType != SqlDataType.Enum
&&
column.Spec.DbType != SqlDataType.Bit) {
// code here!
}
2. 從 Entity 快取裡,取出該外鍵欄位參照的所有資料
IEntity refSchema = EntityCache.GetFirst(column.Refer.Type);
List<IEntity> instances = refSchema.References;
3. 以<select>表單呈現
sb.AppendFormat(
"<select id=\"{0}\" name=\"{0}\">",
column.AsName
);
if(!column.Spec.NotAllowNull) {
// allow null 欄位,新增一個 value 屬性為空字串的選項
sb.Append("<option>-- 請選擇 --</option>");
}
foreach(var instance in instances) {
sb.AppendFormat(
"<option value=\"{0}\">{1}</option>",
instance.KeyValue,
instance.TitleValue
);
}
sb.Append("</select>");